今天要學習的是 Shadowing,這是 Scope & Closure CH.3 的內容,一起來看看 Scope 與 shadowing 之間有什麼關聯。
先看這段程式碼
var studentName = "Suzi";
function printStudentName(studentName) {
studentName = studentName.toUpperCase();
console.log(studentName);
}
printStudentName("Frank"); // FRRANK
printStudentName(studentName); // SUZI
console.log(studentName); // Suzi
第一行由 const 宣告的 studentName
形成了一個 scope,我們暫且標記它為 RED(1);
接著 function 的參數 studentName
形成了另外一個 scope,我們標記它為 BLUE(2);
在 function 裡所有的 studentName
都是 reference 到 BLUE(2) (因為作用域的關係);
重點來了,我們知道 variable look up 會向上、向外尋找有沒有匹配的 variable,但在上面的情形 function 的參數 studentName
與更向上一層的 RED(1) studentName
有同樣的名稱,因此 function 裡所有的 studentName
完全不可能 reference 到 RED(1) studentName
;
上面的情況及稱作 shadowing
BLUE(2) 的 studentName
shadowing RED(1) 的 studentName
,因為 shadowing,function 裡 studentName
的 re-assignment 不會影響到 RED(1) 的 studentName
;
總結:
倘若今天有個變數 shadowing 外層的 (shadowed) 變數(就像 studentName
),shadowing 的變數不會影響到外層的(shadowed)變數,因為在 reference 到外層的變數之前,一定會先 reference 到 shadowing 的變數,因爲如此 console.log(studentName)
回傳的是 Suzi
,而不是 SUZI
。